package com.powernode.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.powernode.constant.ManagerConstants;
import com.powernode.entity.SysMenu;
import com.powernode.ex.handler.BusinessException;
import com.powernode.service.SysMenuService;
import com.powernode.mapper.SysMenuMapper;
import com.powernode.vo.MenuAndAuth;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
* @author yanju
* &#064;description  针对表【sys_menu(菜单管理)】的数据库操作Service实现
* &#064;createDate  2024-11-01 16:01:33
 */
@Service
@CacheConfig(cacheNames = "com.powernode.service.impl.SysMenuServiceImpl")
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu>
    implements SysMenuService{

    @Autowired
    private SysMenuMapper sysMenuMapper;



    /**
     * 根据用户标识查询菜单权限集合
     * @param loginUserId 用户登录id
     */
    @Override
    @Cacheable(key = "#loginUserId")
    public Set<SysMenu> queryUserMenuListByUserid(Long loginUserId) {
        //根据用户标识查询菜单权限集合
        Set<SysMenu> menus = sysMenuMapper.selectUserMenuListByUserId(loginUserId);
        //前端获取道德菜单权限集合是乱的，需要按照菜单那种树结构返回
        //将菜单权限集合转为树结构(层级关系)第二个参数是根目录
        return transformTree(menus,0L);
    }



    /**
     * 集合转为树结构(层级关系)
     *  1.已知菜单深度 <=2
     *  2.未知菜单深度
     *
     * @param menus 菜单数据集合
     * @param pid 根目录
     * @return 树结构的菜单权限集合
     */
    private Set<SysMenu> transformTree(Set<SysMenu> menus, Long pid) {
        //已知菜单深度 <= 2
        /*//从菜单集合中获取根节点集合
        Set<SysMenu> roots = menus.stream()
                .filter(m -> m.getParentId().equals(pid))
                .collect(Collectors.toSet());
        //循环遍历根节点集合
        roots.forEach(root -> {
            //从菜单中过滤出他的父节点值于当前节点的id值一直的菜单集合(孩子节点)
            Set<SysMenu> child = menus.stream().filter(m -> m.getParentId().equals(root.getMenuId()))
                    .collect(Collectors.toSet());
            root.setList(child);
        });*/


        //未知菜单深度
        Set<SysMenu> roots = menus.stream().filter(m -> m.getParentId().equals(pid))
                .collect(Collectors.toSet());

        roots.forEach(r -> r.setList(transformTree(menus,r.getMenuId())));
        return roots;
    }

    /**
     * 查询系统所有权限集合
     * @return
     */
    @Override
    @Cacheable(key = ManagerConstants.SYS_ALL_MENU_KEY)
    public List<SysMenu> queryAllSysMenuList() {

        return null;
    }

    /**
     * 新增权限
     * @param sysMenu 权限信息
     * @return 是否新增成功 true 成功
     */
    @Override
    @CacheEvict(key = ManagerConstants.SYS_ALL_MENU_KEY)
    public Boolean saveSysMenu(SysMenu sysMenu) {
        return sysMenuMapper.insert(sysMenu) > 0;
    }

    /**
     * 修改菜单权限信息
     * @param sysMenu 菜单权限对象
     * @return 是修改成功 true：成功
     */
    @Override
    @CacheEvict(key = ManagerConstants.SYS_ALL_MENU_KEY)
    public Boolean modifySysMenu(SysMenu sysMenu) {
        Integer type = sysMenu.getType();
        if (type == 0){
            sysMenu.setParentId(0L);
        }
        return sysMenuMapper.updateById(sysMenu) > 0;
    }

    /**
     * 删除菜单权限
     * 如果当前菜单节点包含子节点，不可删除
     * @param menuId 权限id
     * @return 是否删除成功 成功：true
     */
    @Override
    @CacheEvict(key = ManagerConstants.SYS_ALL_MENU_KEY)
    public Boolean removeSysMenuById(Long menuId) {
        //1.根据菜单标识获取子菜单集合
        List<SysMenu> sysMenuList = sysMenuMapper.selectList(new LambdaQueryWrapper<SysMenu>()
                .eq(SysMenu::getMenuId, menuId));
        if (sysMenuList.isEmpty()){
            //2.有值说明包含子节点不能删除
            throw new BusinessException("当前菜单包含子节点集合，不能删");
        }


        return sysMenuMapper.deleteById(menuId)>0;
    }

}




